package Proj_pack;
import java.util.ArrayList;


public class Knoten {
	
	private final int id;
	private final int capacity;
	private Mash mash;

	private ArrayList<Integer> nachfolger;
	private ArrayList<Knoten> vorganger;
	
	public Knoten(int id, int cap){
		this.id = id;
		this.capacity = cap;
		nachfolger = new ArrayList<Integer>(1);
		vorganger = new ArrayList<Knoten>(1);
	}

	public synchronized void addNf(Knoten nf){
//		if (nf==null)throw new IllegalArgumentException("nachfolger null");
		this.nachfolger.add(nf.getId());
	}
	
	public synchronized void addPre(Knoten vg){
//		if (vg==null)throw new IllegalArgumentException("vorganger null");
		this.vorganger.add(vg);
	}

	public int getId() {
		return id;
	}

	public int getCapacity() {
		return capacity;
	}

	public synchronized Mash getMash() {
		return mash;
	}
	
//	public synchronized Mash tryGetMash() {
//		if(!mash.lock.tryLock()){
//			
//			//da wir mit dem ganzen spliter abbrechen wenn wir das lock auf preMash nicht kriegen, versuchen wirs lieber noch ein zweites mal.
//			if(mash.lock.tryLock()){ 
//				return mash;			
//			}else {
//				return null;			
//			}
//		}else{
//			return mash;
//		}
//	}
	
	public synchronized Mash tryGetMash() {
		if(mash==null){return null;}
		if(mash.lock.tryLock()){ 
				return mash;		
			}else {
				return null;			
			}
	}


	public synchronized void setMash(Mash mash) {
		
//		if (mash!=null){
		mash.lock.lock();
		try{
	
		this.mash = mash;
		}finally{
			mash.lock.unlock();
		}
//	}else{
//		this.mash=null;
//	}
	}
	
	public boolean zeigtAufSpliter(int[] spliter){
		for(int kId : nachfolger){
			for(int i = 0; i < spliter.length; i++){
				if (spliter[i]==kId)return true;
			}
		}
		return false;
	}
	

	public synchronized void changeMash(Mash mashtarget) {
		mashtarget.lock.lock();
		try{
		Mash orig = mash;
		orig.lock.lock();
		try{
			this.mash.removeKnoten(this);
			mashtarget.add(this);
		}finally{
			orig.lock.unlock();
		}	
		}finally{
			mashtarget.lock.unlock();
		}
	}

	public ArrayList<Knoten> getVorganger() {
			return vorganger;

	}
	public ArrayList<Integer> getNachfolger(){
			return nachfolger;
	}
	
	
	public synchronized String toString(){
		StringBuffer sb = new StringBuffer();
		sb.append("[ >"+ id + "< " + capacity + " (vor: ");
				for (Knoten k: vorganger){
					sb.append(" " + k.getId() +" ");
				}
				sb.append(") (nach: ");
				for (int kId: nachfolger){
					sb.append(" " + kId +" ");
				}
				
				sb.append(")]");
		return sb.toString();
	}

//	@Override
//	public int hashCode() {
//		final int prime = 31;
//		int result = 1;
//		result = prime * result + capacity;
//		result = prime * result + id;
//		return result;
//	}
//
//	@Override
//	public boolean equals(Object obj) {
//		if (this == obj)
//			return true;
//		if (obj == null)
//			return false;
//		if (getClass() != obj.getClass())
//			return false;
//		Knoten other = (Knoten) obj;
//		if (capacity != other.capacity)
//			return false;
//		if (id != other.id)
//			return false;
//		return true;
//	}


	
}
